package model;

import java.util.ArrayList;
import java.util.List;

import util.Estatistica;
import util.GraficoClientes;
import util.GraficoLinha;
import util.GraficoTransiente;
import util.ListaUtil;
import fila.Caso1;
import fila.Caso2;
import fila.CasoAula17;
import fila.MD1;
import fila.MM1;

public class GeradorAmostras {
	
	public void md1(int totalAmostras, int totalClientes, double lambda, double mi) {
		MD1 md1 = new MD1(lambda, mi);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			List<Double> l = md1.runFCFS(totalClientes);

			amostrasMedia.add(Estatistica.getMedia(l));
			amostrasVariancia.add(Estatistica.getVariancia(l));
			
			
		}

		System.out.println("MD1 - FCFS");
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
	}
	
	public void mm1FCFS(int totalAmostras, int totalClientes, double lambda, double mi) {
		MM1 mm1 = new MM1(lambda, mi);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			List<Double> l = mm1.runFCFS(totalClientes);

			amostrasMedia.add(Estatistica.getMedia(l));
			amostrasVariancia.add(Estatistica.getVariancia(l));
		}

		System.out.println("MM1 - FCFS");
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
	}
	
	public void mm1LCFS(int totalAmostras, int totalClientes, double lambda, double mi) {
		MM1 mm1 = new MM1(lambda, mi);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			List<Double> l = mm1.runLCFSComInterrupcaoComContinuidade(totalClientes);

			amostrasMedia.add(Estatistica.getMedia(l));
			amostrasVariancia.add(Estatistica.getVariancia(l));
		}

		System.out.println("MM1 - LCFS com interrupcao e continuidade");
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
	}
	
	public void aula17(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2) {
		CasoAula17 c = new CasoAula17(lambda, mi1, mi2);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			Resultado r = c.runFCFSFCFSSemInterrupcao(totalClientes);
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
		}

		System.out.println("MM1 FCFS e MM1 FCFS - sem interrupcao");
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
	}
	
	public void aula17Interrupcao(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2) {
		CasoAula17 c = new CasoAula17(lambda, mi1, mi2);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			Resultado r = c.runFCFSFCFSComInterrupcao(totalClientes);
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
		}

		System.out.println("MM1 FCFS e MM1 FCFS - com interrupcao");
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
	}
	
	public void caso1(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2) {
		Caso1 m = new Caso1(lambda, mi1, mi2);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		
		
		Resultado r = new Resultado();
		
		for(int i = 0; i < totalAmostras; i++) {
			System.out.println("Rodada: " + i);
			r = m.runDetExp(totalClientes);
			
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
		}
		
		System.out.println("Caso 1");
		System.out.println("Para lambda: " + lambda + " mi1: " + mi1 + " e mi2: " + mi2);
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
		System.out.println("Tempo medio no Sistema = " + Estatistica.getMedia(amostrasMedia));
	}
	
	public void caso1Graficos(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2) {
		Caso1 m = new Caso1(lambda, mi1, mi2);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		List<List<Double>> resultList = new ArrayList<List<Double>>();
		
		Resultado r = new Resultado();
		for(int i = 0; i < totalAmostras; i++) {
			r = m.runDetExp(totalClientes);
			System.out.println("rodada " + i);
			
			
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			
			resultList.add(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2()));
		}
		
		GraficoLinha grafico_CDF = new GraficoLinha("Grafico - CDF","CDF",resultList);
		grafico_CDF.pack();
		grafico_CDF.setVisible(true);
		
		System.out.println("Caso 1");
		System.out.println("Para lambda: " + lambda + " mi1: " + mi1 + " e mi2: " + mi2);
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
		System.out.println("Tempo medio no Sistema = " + Estatistica.getMedia(amostrasMedia));
	}
	
	public void caso1SemContinuidade(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2) {
		Caso1 m = new Caso1(lambda, mi1, mi2);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			Resultado r = m.runDetExpSemContinuidade(totalClientes);
			
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
		}

		System.out.println("Caso 1 - Sem continuidade");
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
	}
	
	public void caso2(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2) {
		Caso2 m = new Caso2(lambda, mi1, mi2);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		List<List<Double>> resultList = new ArrayList<List<Double>>();

		Resultado r;
		for(int i = 0; i < totalAmostras; i++) {
			r = m.runDetExp(totalClientes);
			
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			
			System.out.println(Estatistica.getMedia(r.getListaTempo1()));
			System.out.println(Estatistica.getMedia(r.getListaTempo2()) + "\n");
			resultList.add(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2()));
		}
		
		GraficoLinha grafico_CDF = new GraficoLinha("Gráfico - CDF","CDF",resultList);
		grafico_CDF.pack();
		grafico_CDF.setVisible(true);

		System.out.println("Caso 2");
		System.out.println("Para lambda: " + lambda + " mi1: " + mi1 + " e mi2: " + mi2);
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
		System.out.println("Tempo medio no Sistema = " + Estatistica.getMedia(amostrasMedia));
	}

	public void caso1Normal(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2, double dp) {
		Caso1 m = new Caso1(lambda, mi1, mi2, dp);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			Resultado r = m.runNormalExp(totalClientes);
			
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
		}

		System.out.println("Caso 1 - Normal");
		System.out.println("Para lambda: " + lambda + " mi1: " + mi1 + " e mi2: " + mi2);
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
		System.out.println("Tempo medio no Sistema = " + Estatistica.getMedia(amostrasMedia));
	}

	public void caso2Normal(int totalAmostras, int totalClientes, double lambda, double mi1, double mi2, double dp) {
		Caso2 m = new Caso2(lambda, mi1, mi2, dp);
		List<Double> amostrasMedia = new ArrayList<Double>();
		List<Double> amostrasVariancia = new ArrayList<Double>();
		
		for(int i = 0; i < totalAmostras; i++) {
			Resultado r = m.runNormalExp(totalClientes);
			
			amostrasMedia.add(Estatistica.getMedia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
			amostrasVariancia.add(Estatistica.getVariancia(ListaUtil.getSoma(r.getListaTempo1(), r.getListaTempo2())));
		}

		System.out.println("Caso 2 - Normal");
		System.out.println("Para lambda: " + lambda + " mi1: " + mi1 + " e mi2: " + mi2);
		System.out.println("IC da media = " + Estatistica.getIntervaloConfianca(amostrasMedia));
		System.out.println("IC da variancia = " + Estatistica.getIntervaloConfianca(amostrasVariancia));
		System.out.println("Tempo medio no Sistema = " + Estatistica.getMedia(amostrasMedia));
	}

	public void caso1Transiente(int totalClientes, double lambda, double mi1, double mi2, double dp) {
		Caso1 m = new Caso1(lambda, mi1, mi2);
		
		GraficoTransiente gc = new GraficoTransiente("Transiente", "Transiente", m.runDetExpTransiente(totalClientes), m.runDetExpSemContinuidadeTransiente(totalClientes));
		gc.pack();
		gc.setVisible(true);
	}

	public void caso1Instavel(int totalClientes, double lambda, double mi1, double mi2) {
		Caso1 m = new Caso1(lambda, mi1, mi2);
		
		GraficoClientes grafico_CDF = new GraficoClientes("Instavel", "Instavel", m.runDetExpInstavel(totalClientes));
		grafico_CDF.pack();
		grafico_CDF.setVisible(true);
	}
	
}
